home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / ALLERLEI / GOBJ_112 / SOURCE / BEISPIEL / BEISPL06.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-03-03  |  11.7 KB  |  497 lines

  1. program Beispiel; {$X+} { Beispiel Nr.6 }
  2.  
  3. uses
  4.  
  5.     Gem,Objects,OTypes,OProcs,OWindows,ODialogs;
  6.  
  7. const
  8.  
  9.     {$I beispiel.i}
  10.  
  11. type
  12.  
  13.     TMyApplication = object(TApplication)
  14.         procedure InitInstance; virtual;
  15.         procedure InitMainWindow; virtual;
  16.     end;
  17.  
  18.     PBeispielWindow = ^TBeispielWindow;
  19.     TBeispielWindow = object(TWindow)
  20.         Veraendert: boolean;
  21.         Dicke,
  22.         Farbe,
  23.         Art       : integer;
  24.         Pfad,
  25.         Datei     : string;
  26.         Zeichnung : PCollection;
  27.         constructor Init(AParent: PWindow; ATitle: string);
  28.         destructor Done; virtual;
  29.         function CanClose: boolean; virtual;
  30.         procedure Paint(var PaintInfo: TPaintStruct); virtual;
  31.         procedure WMButton(mX,mY,BStat,KStat,Clicks: integer); virtual;
  32.         { neue Methoden: }
  33.         procedure SetAttr(Width,Color,Style: integer); virtual;
  34.         procedure CreateTitle; virtual;
  35.     end;
  36.  
  37.     PAttrDialog = ^TAttrDialog;
  38.     TAttrDialog = object(TDialog)
  39.         function OK: boolean; virtual;
  40.         function Help: boolean; virtual;
  41.     end;
  42.  
  43.     PLineData = ^TLineData;
  44.     TLineData = record
  45.         Farben: array [0..7] of integer;
  46.         Stile : array [1..6] of integer;
  47.         Breite: string[5]
  48.     end;
  49.  
  50.     PLinie = ^TLinie;
  51.     TLinie = object(TObject)
  52.         Punkte: PCollection;
  53.         Dicke,
  54.         Farbe,
  55.         Art   : integer;
  56.         constructor Init(Width,Color,Style: integer);
  57.         destructor Done; virtual;
  58.         procedure NeuerPunkt(AX,AY: integer); virtual;
  59.         procedure Zeichnen; virtual;
  60.     end;
  61.  
  62.     PPunkt = ^TPunkt;
  63.     TPunkt = object(TObject)
  64.         X,
  65.         Y: integer;
  66.         constructor Init(AX,AY: integer);
  67.     end;
  68.  
  69.     PAbout  = ^TAbout;
  70.     TAbout  = object(TKeyMenu)
  71.         procedure Work; virtual;
  72.     end;
  73.  
  74.     PNew    = ^TNew;
  75.     TNew    = object(TKeyMenu)
  76.         procedure Work; virtual;
  77.     end;
  78.  
  79.     POpen   = ^TOpen;
  80.     TOpen   = object(TKeyMenu)
  81.         procedure Work; virtual;
  82.     end;
  83.  
  84.     PSave   = ^TSave;
  85.     TSave   = object(TKeyMenu)
  86.         procedure Work; virtual;
  87.     end;
  88.  
  89.     PSaveAs = ^TSaveAs;
  90.     TSaveAs = object(TKeyMenu)
  91.         procedure Work; virtual;
  92.     end;
  93.  
  94.     PInfo   = ^TInfo;
  95.     TInfo   = object(TKeyMenu)
  96.         procedure Work; virtual;
  97.     end;
  98.  
  99.     PAttrib = ^TAttrib;
  100.     TAttrib = object(TKeyMenu)
  101.         LineData: TLineData;
  102.         procedure Work; virtual;
  103.     end;
  104.  
  105. var
  106.  
  107.     MyApp: TMyApplication;
  108.  
  109.  
  110. procedure MyResource; external; {$L beispiel.o}
  111.  
  112.  
  113. procedure TMyApplication.InitInstance;
  114.  
  115.     begin
  116.         InitResource(@MyResource,nil);
  117.         LoadMenu(BSPMENU);
  118.         new(PAbout,Init(@self,K_CTRL,Ctrl_A,MABOUT,MTITLE1));
  119.         new(PNew,Init(@self,K_CTRL,Ctrl_N,MNEW,MTITLE2));
  120.         new(POpen,Init(@self,K_CTRL,Ctrl_O,MOPEN,MTITLE2));
  121.         new(PSave,Init(@self,K_CTRL,Ctrl_S,MSAVE,MTITLE2));
  122.         new(PSaveAs,Init(@self,K_CTRL,Ctrl_D,MSAVEAS,MTITLE2));
  123.         new(PInfo,Init(@self,K_CTRL,Ctrl_I,MINFO,MTITLE3));
  124.         new(PAttrib,Init(@self,K_CTRL,Ctrl_T,MATTR,MTITLE3));
  125.         inherited InitInstance;
  126.         SetQuit(MQUIT,MTITLE2)
  127.     end;
  128.  
  129.  
  130. procedure TMyApplication.InitMainWindow;
  131.  
  132.     begin
  133.         new(PBeispielWindow,Init(nil,'Beispiel  [unbenannt]'));
  134.         if (MainWindow=nil) or (ChkError<em_OK) then
  135.             Status:=em_InvalidMainWindow
  136.     end;
  137.  
  138.  
  139. constructor TBeispielWindow.Init(AParent: PWindow; ATitle: string);
  140.  
  141.     begin
  142.         if not(inherited Init(AParent,ATitle)) then fail;
  143.         new(Zeichnung,Init(10,10));
  144.         Veraendert:=false;
  145.         SetAttr(3,Blue,LT_SOLID);
  146.         Datei:='';
  147.         Pfad:=''
  148.     end;
  149.  
  150.  
  151. destructor TBeispielWindow.Done;
  152.  
  153.     begin
  154.         dispose(Zeichnung,Done);
  155.         inherited Done
  156.     end;
  157.  
  158.  
  159. function TBeispielWindow.CanClose: boolean;
  160.     var valid: boolean;
  161.  
  162.     begin
  163.         valid:=inherited CanClose;
  164.         if valid and Veraendert then
  165.             valid:=(Application^.Alert(@self,1,WAIT,
  166.                 ' Die Grafik wurde verändert!| Wollen Sie sie speichern?',
  167.               '&Ja|  &Nein  ')=2);
  168.         CanClose:=valid
  169.     end;
  170.  
  171.  
  172. procedure ZeichneLinienzug(p: PLinie);
  173.  
  174.     begin
  175.         p^.Zeichnen
  176.     end;
  177.  
  178.  
  179. procedure TBeispielWindow.Paint(var PaintInfo: TPaintStruct);
  180.  
  181.     begin
  182.         Zeichnung^.ForEach(@ZeichneLinienzug)
  183.     end;
  184.  
  185.  
  186. procedure TBeispielWindow.WMButton(mX,mY,BStat,KStat,Clicks: integer);
  187.     var xalt,yalt,btn,dummy: integer;
  188.         pxyarray           : ptsin_ARRAY;
  189.         ALinie             : PLinie;
  190.  
  191.     begin
  192.         if bTst(BStat,1) then
  193.             if GetDC>=0 then
  194.                 begin
  195.                     wind_update(BEG_MCTRL);
  196.                     vsl_width(vdiHandle,Dicke);
  197.                     vsl_color(vdiHandle,Farbe);
  198.                     vsl_type(vdiHandle,Art);
  199.                     vsl_ends(vdiHandle,LE_ROUNDED,LE_ROUNDED);
  200.                     ALinie:=new(PLinie,Init(Dicke,Farbe,Art));
  201.                     Zeichnung^.Insert(ALinie);
  202.                     ALinie^.NeuerPunkt(mX-Work.X,mY-Work.Y);
  203.                     repeat
  204.                         xalt:=mX;
  205.                         yalt:=mY;
  206.                         repeat
  207.                             graf_mkstate(mX,mY,btn,dummy)
  208.                         until (mX<>xalt) or (mY<>yalt) or not(bTst(btn,1));
  209.                         pxyarray[0]:=xalt;
  210.                         pxyarray[1]:=yalt;
  211.                         pxyarray[2]:=mX;
  212.                         pxyarray[3]:=mY;
  213.                         v_pline(vdiHandle,2,pxyarray);
  214.                         ALinie^.NeuerPunkt(mX-Work.X,mY-Work.Y)
  215.                     until not(bTst(btn,1));
  216.                     wind_update(END_MCTRL);
  217.                     ReleaseDC;
  218.                     Veraendert:=true;
  219.                     CreateTitle
  220.                 end;
  221.         if bTst(BStat,2) then
  222.             begin
  223.                 Zeichnung^.FreeAll;
  224.                 ForceRedraw;
  225.                 Veraendert:=false;
  226.                 CreateTitle
  227.             end
  228.     end;
  229.  
  230.  
  231. procedure TBeispielWindow.SetAttr(Width,Color,Style: integer);
  232.     const farben: array [0..7] of string[7] =
  233.         ('weiß','schwarz','rot','grün','blau','türkis','gelb','violett');
  234.                 arten: array [1..6] of string[16] =
  235.         ('durchgehend','langer Strich','Punkte','Strich, Punkt',
  236.                                      'Strich','Strich, 2 Punkte');
  237.  
  238.     begin
  239.         Dicke:=Width;
  240.         Farbe:=Color;
  241.         Art:=Style;
  242.         SetSubTitle(' Dicke: '+ltoa(Dicke)+'  Farbe: '+farben[Farbe]+
  243.                                 '   Art: '+arten[Art])
  244.     end;
  245.  
  246.  
  247. procedure TBeispielWindow.CreateTitle;
  248.     var titel: string;
  249.  
  250.     begin
  251.         if length(Datei)=0 then titel:='[unbenannt]'
  252.         else
  253.             titel:=Pfad+Datei;
  254.         if Veraendert then titel:='*'+titel;
  255.         titel:='Beispiel  '+titel;
  256.         SetTitle(titel)
  257.     end;
  258.  
  259.  
  260. function TAttrDialog.OK: boolean;
  261.     var valid: boolean;
  262.         d,f,s: integer;
  263.         attrb: ARRAY_4;
  264.  
  265.     begin
  266.         valid:=inherited OK;
  267.         if valid then
  268.             begin
  269.                 with PLineData(TransferBuffer)^ do
  270.                     begin
  271.                         f:=0;
  272.                         while Farben[f]<>bf_Checked do inc(f);
  273.                         s:=1;
  274.                         while Stile[s]<>bf_Checked do inc(s);
  275.                         vsl_width(vdiHandle,atol(Breite))
  276.                     end;
  277.                 vql_attributes(vdiHandle,attrb);
  278.                 PBeispielWindow(Application^.MainWindow)^.SetAttr(attrb[3],f,s)
  279.             end;
  280.         OK:=valid
  281.     end;
  282.  
  283.  
  284. function TAttrDialog.Help: boolean;
  285.  
  286.     begin
  287.         Application^.Alert(@self,1,NO_ICON,'In dieser Dialogbox werden die|Attribute der Linien eingestellt.|Die neuen Werte gelten ab der|ersten Linie, die nach dem|Schließen der Box gezeichnet|wird.','   &OK   ');
  288.         Help:=false
  289.     end;
  290.  
  291.  
  292. constructor TLinie.Init(Width,Color,Style: integer);
  293.  
  294.     begin
  295.         if not(inherited Init) then fail;
  296.         new(Punkte,Init(50,50));
  297.         Dicke:=Width;
  298.         Farbe:=Color;
  299.         Art:=Style
  300.     end;
  301.  
  302.  
  303. destructor TLinie.Done;
  304.  
  305.     begin
  306.         dispose(Punkte,Done);
  307.         inherited Done
  308.     end;
  309.  
  310.  
  311. procedure TLinie.NeuerPunkt(AX,AY: integer);
  312.  
  313.     begin
  314.         Punkte^.Insert(new(PPunkt,Init(AX,AY)))
  315.     end;
  316.  
  317.  
  318. procedure TLinie.Zeichnen;
  319.     var q       : longint;
  320.         vh,dx,dy: integer;
  321.         pxyarray: ptsin_ARRAY;
  322.  
  323.     begin
  324.         if Punkte^.Count>1 then
  325.             begin
  326.                 with Application^ do
  327.                     begin
  328.                         vh:=vdiHandle;
  329.                         dx:=MainWindow^.Work.X;
  330.                         dy:=MainWindow^.Work.Y
  331.                     end;
  332.                 vsl_width(vh,Dicke);
  333.                 vsl_color(vh,Farbe);
  334.                 vsl_type(vh,Art);
  335.                 vsl_ends(vh,LE_ROUNDED,LE_ROUNDED);
  336.                 with PPunkt(Punkte^.At(0))^ do
  337.                     begin
  338.                         pxyarray[2]:=X+dx;
  339.                         pxyarray[3]:=Y+dy
  340.                     end;
  341.                 for q:=1 to pred(Punkte^.Count) do
  342.                     with PPunkt(Punkte^.At(q))^ do
  343.                         begin
  344.                             pxyarray[0]:=pxyarray[2];
  345.                             pxyarray[1]:=pxyarray[3];
  346.                             pxyarray[2]:=X+dx;
  347.                             pxyarray[3]:=Y+dy;
  348.                             v_pline(vh,2,pxyarray)
  349.                         end
  350.             end
  351.     end;
  352.  
  353.  
  354. constructor TPunkt.Init(AX,AY: integer);
  355.  
  356.     begin
  357.         if not(inherited Init) then fail;
  358.         X:=AX;
  359.         Y:=AY
  360.     end;
  361.  
  362.  
  363. procedure TAbout.Work;
  364.  
  365.     begin
  366.         if ADialog=nil then
  367.             begin
  368.                 new(ADialog,Init(nil,'Über Beispiel',BSPABOUT));
  369.                 if ADialog<>nil then
  370.                     begin
  371.                         new(PGroupBox,Init(ADialog,IGROUP,'ObjectGEM '+
  372.                                                                 'Beispielprogramm','"42"'));
  373.                         new(PButton,Init(ADialog,IOK,id_OK,true,'Mit diesem '+
  374.                                             'Button|kann die Infobox|verlassen werden.'))
  375.                     end
  376.             end;
  377.         if ADialog<>nil then ADialog^.MakeWindow
  378.     end;
  379.  
  380.  
  381. procedure TNew.Work;
  382.  
  383.     begin
  384.         with PBeispielWindow(Application^.MainWindow)^ do
  385.             begin
  386.                 Zeichnung^.FreeAll;
  387.                 ForceRedraw;
  388.                 Veraendert:=false;
  389.                 Pfad:='';
  390.                 Datei:='';
  391.                 CreateTitle
  392.             end
  393.     end;
  394.  
  395.  
  396. procedure TOpen.Work;
  397.  
  398.     begin
  399.         Application^.Alert(nil,1,NOTE,'Die Funktion ist noch|'+
  400.                                                     'nicht implementiert.',' &Schade ')
  401.     end;
  402.  
  403.  
  404. procedure TSave.Work;
  405.  
  406.     begin
  407.         Application^.Alert(nil,1,NOTE,'Die Funktion ist noch|'+
  408.                                                     'nicht implementiert.',' &Schade ')
  409.     end;
  410.  
  411.  
  412. procedure TSaveAs.Work;
  413.  
  414.     begin
  415.         Application^.Alert(nil,1,NOTE,'Die Funktion ist noch|'+
  416.                                                     'nicht implementiert.',' &Schade ')
  417.     end;
  418.  
  419.  
  420. procedure TInfo.Work;
  421.  
  422.     begin
  423.         Application^.Alert(nil,1,NOTE,'Die Funktion ist noch|'+
  424.                                                     'nicht implementiert.',' &Schade ')
  425.     end;
  426.  
  427.  
  428. procedure TAttrib.Work;
  429.     var q: integer;
  430.  
  431.     begin
  432.         if ADialog=nil then
  433.             begin
  434.                 ADialog:=new(PAttrDialog,Init(nil,'Attribute',BSPATTR));
  435.                 if ADialog<>nil then
  436.                     begin
  437.                         new(PGroupBox,Init(ADialog,ACGROUP,'Farbe',
  438.                                                         'Bestimmt die|Linienfarbe'));
  439.                         new(PGroupBox,Init(ADialog,ASGROUP,'Stil',
  440.                                                         'Bestimmt den|Linienstil'));
  441.                         new(PRadioButton,Init(ADialog,AWHITE,true,
  442.                                                         'Setzt Weiß als|neue Linienfarbe'));
  443.                         new(PRadioButton,Init(ADialog,ABLACK,true,
  444.                                                         'Setzt Schwarz als|neue Linienfarbe'));
  445.                         new(PRadioButton,Init(ADialog,ARED,true,
  446.                                                         'Setzt Rot als|neue Linienfarbe'));
  447.                         new(PRadioButton,Init(ADialog,AGREEN,true,
  448.                                                         'Setzt Grün als|neue Linienfarbe'));
  449.                         new(PRadioButton,Init(ADialog,ABLUE,true,
  450.                                                         'Setzt Blau als|neue Linienfarbe'));
  451.                         new(PRadioButton,Init(ADialog,ACYAN,true,
  452.                                                         'Setzt Türkis als|neue Linienfarbe'));
  453.                         new(PRadioButton,Init(ADialog,AYELLOW,true,
  454.                                                         'Setzt Gelb als|neue Linienfarbe'));
  455.                         new(PRadioButton,Init(ADialog,AMAGENTA,true,
  456.                                                         'Setzt Violett als|neue Linienfarbe'));
  457.                         new(PRadioButton,Init(ADialog,ASOLID,true,
  458.                                                         'Setzt LT_SOLID als|neuen Linienstil'));
  459.                         new(PRadioButton,Init(ADialog,ALONG,true,
  460.                                                         'Setzt LT_LONGDASH als|neuen Linienstil'));
  461.                         new(PRadioButton,Init(ADialog,ADOTS,true,
  462.                                                         'Setzt LT_DOTTED als|neuen Linienstil'));
  463.                         new(PRadioButton,Init(ADialog,ALINEDOT,true,
  464.                                                         'Setzt LT_DASHDOT als|neuen Linienstil'));
  465.                         new(PRadioButton,Init(ADialog,ALINE,true,
  466.                                                         'Setzt LT_DASHED als|neuen Linienstil'));
  467.                         new(PRadioButton,Init(ADialog,ALIN2DOT,true,
  468.                                                         'Setzt LT_DASHDOTDOT|als neuen Linienstil'));
  469.                         new(PEdit,Init(ADialog,AWIDTH,5,
  470.                                     'Gibt die Linien-|stärke an (1,3,..).|Immer UNgerade!'));
  471.                         new(PButton,Init(ADialog,ACANCEL,id_Cancel,true,
  472.                             'Bricht den Dialog ab,|ohne die neuen Werte|zu übernehmen'));
  473.                         new(PButton,Init(ADialog,AOK,id_OK,true,
  474.                                                     'Beendet den Dialog und|setzt die neuen Werte'));
  475.                         new(PButton,Init(ADialog,AHELP,id_Help,false,
  476.                             'Zeigt einen allgemeinen|Hilfstext über diesen|Dialog an.'));
  477.                         with PBeispielWindow(Application^.MainWindow)^ do
  478.                             with LineData do
  479.                                 begin
  480.                                     for q:=0 to 7 do Farben[q]:=bf_Unchecked;
  481.                                     for q:=1 to 6 do Stile[q]:=bf_Unchecked;
  482.                                     Farben[Farbe]:=bf_Checked;
  483.                                     Stile[Art]:=bf_Checked;
  484.                                     Breite:=ltoa(Dicke)
  485.                                 end;
  486.                         ADialog^.TransferBuffer:=@LineData
  487.                     end
  488.             end;
  489.         if ADialog<>nil then ADialog^.MakeWindow
  490.     end;
  491.  
  492.  
  493. begin
  494.     MyApp.Init('BSPL','Beispiel');
  495.     MyApp.Run;
  496.     MyApp.Done
  497. end.